import { defineStore } from 'pinia'

import defineRouters from '@/router/routers'
import WhiteListRouter from '@/router/whiteListRouter'

/***
 * 将menu 数组 组装成 menu 权限队列
 * @param arrays
 * @param key
 * @param parentKey
 * @returns {[]|*[]}
 */

const arrayToTree=(arrays , key , parentKey)=> {
    //判断拿到的数据是否是数组，如果值是Array，则为true; 否则为false。
    if (!Array.isArray(arrays)) {
        return []
    }
    //深拷贝，否则会影响原数组
    let node = JSON.parse(JSON.stringify(arrays))
    //根据父节点进行拼接子节点，先判断里面是否有子节点，如果已经有的话，先删了
    node.forEach(item => delete item.children)

    // 缓存设置中的首页与重定向地址
    let baseUrl = [];
    let redirect = [];

    // 定义map 对象存放组装的 router
    let routerMap={}
    let newNode = []
    //把每一项的引用放入map对象里
    node.forEach(item => {
        const { Url , Visible , Name } = item
        // 比对路由地址 ， 如果能在  defineRouters 中，匹配到对应的静态文件， 则说明该路由有效，
        const route = defineRouters.find(r=>r.path === Url)
       // const route = true
        // 如果该路由有效
        if(route){
            routerMap[item[key]]={
                ...route,
                name:Url.replace(/\//g, '_'),
                meta:{ ...route.meta, title:Name, Visible }
            }
        }else{
            routerMap[item[key]]={
                path:Url,
                component: () => import('@pages/404.vue'),
                name:Url.replace(/\//g, '_'),
                meta:{ title:Name , Visible }
            }
        }
    })


    node.forEach(dt => {
        let parents = routerMap[dt[parentKey]]
        let route = routerMap[dt[key]]
        if(route){
            if(route.meta.baseUri){
                baseUrl.push(route.path)
            }
            if(route.meta.redirect){
                redirect.push(route.path)
            }
            if (parents) {
                ((parents.children) || (parents.children = [])).push(route)
            } else {
                newNode.push(route)
            }
        }
    })

    newNode.forEach(item=>{
        // 设置一级路由的第一位未默认重定向
        if(item?.children?.length){
            if(!item.redirect){
                item.redirect = item?.children[0].path
            }
            item.component = () => import('@pages/routerView.vue')
        }
    })

    return { router:newNode ,baseUrl, redirect}
}


const addRoutes = ({  router=[],baseUrl=[] , redirect=[] })=> {


    let IndexPage = null , layoutPage = null;

    // 如果设置了主页
    if(baseUrl.length){
        IndexPage = router.find(item=> item.path === baseUrl[0] )
        layoutPage = router.filter(item=> item.path !== baseUrl[0])
        $router.addRoute(IndexPage);
    }else{
        layoutPage = [...router]
    }

    const layout = {
        path: '/',
        name: 'layout',
        component: () => import('@pages/layout'),
        children:[
            ...layoutPage
        ]
    };

    if(redirect.length){
        layout.redirect = redirect[0]
    }else{
        layout.redirect = layoutPage[0].path
    }

    $router.addRoute(layout);

}

const useUserMenuStore = defineStore("Menu", {
    state: () =>{
        return {
            menu:null,
            routerMenu:null
        }
    },
    actions: {
       async setMenu(menu){
            if(menu){

                console.time('递归 menu 权限组')

                const { router,baseUrl , redirect } =  arrayToTree(menu,'Id' ,'ParentId')

                console.timeEnd('递归 menu 权限组')

                // 动态添加路由
                await addRoutes( {  router,baseUrl , redirect })

                this.menu = menu
                this.routerMenu = router

                // 登录，路由注册完成后 ， 跳转到主页

                // 检查白名单里是否有设置路由为首页
                WhiteListRouter.forEach(route=>{
                    if(route.meta.baseUri){
                        baseUrl.push(route.path)
                    }
                })

                // 如果识别到具有 baseUrl
                if(baseUrl.length){
                    return baseUrl[0]
                }

                // 如果识别到具有 redirect

                if(redirect[0]){
                    return redirect[0]
                }

                // 否则默认返回权限组第一条路由
                return router[0].path

            }else{

                this.menu = null
                this.routerMenu = null

            }

        }
    },
    persist: {
        enabled: true,
        storage: sessionStorage,
    }
})

export default useUserMenuStore